package com.py.custom.tms.application.jvm.classload;

public class MyTest17_1 {

    public static void main(String[] args) throws Exception {
        // 把MySample.class和MyCat.class复制到类加载器指定的路径(注意包路径也需要)
        // 把MySample_1.class和MyCat_1.class复制到类加载器指定的路径(注意包路径也需要)
        MyTest16 loader1 = new MyTest16("loader1");
        loader1.setPath("/Users/pengyou03/Desktop/");

        //案例一 前提：删除idea下MySample.class和MyCat.class。解释：最终由，loader1加载两个类

        //案例二 前提：删除idea下MyCat.class。
        //  解释：MySample.class最终由AppClassLoader加载，同样MyCat.class也必须由AppClassLoader加载；但是idea下没有；所以报错
        //  错误：Caused by: java.lang.ClassNotFoundException: com.py.custom.tms.application.jvm.classload.MyCat

        //案例三 前提：删除idea下MySample.class。
        //  解释：MySample.class最终由loader1加载，同样MyCat.class也必须由loader1加载但是最终由AppClassLoader加载。
//        Class<?> clazz = loader1.loadClass("com.py.custom.tms.application.jvm.classload.MySample");
//        System.out.println("clazz: " + clazz.hashCode());
//        Object object = clazz.newInstance();

        //案例四 前提：删除idea下MySample_1.class。
            //4.1 操作：把MyCat_1中的注释打开；编译好复制到指定路径下
            //  解释：MySample_1.class最终由loader1加载；同样MyCat_1.class也必须由loader1加载但是最终由AppClassLoader加载。
            //      但是，MyCat_1需要访问MySample_1；在AppClassLoader中以及父类加载器中没有，所以AppClassLoader尝试加载，
            //      但是idea中的MySample_1.class被删除类，所以报错
            // 错误：Caused by: java.lang.ClassNotFoundException: com.py.custom.tms.application.jvm.classload.MySample_1

            //4.2 操作：把MySample_1中的注释打开；编译好复制到指定路径下
            //  解释：MySample_1.class最终由loader1加载；同样MyCat_1.class也必须由loader1加载但是最终由AppClassLoader加载。
            //  MySample_1需要访问MyCat_1；在loader1中没有加载，但是父类加载器(AppClassLoader)中有，所以正常返回。

        //总结：类加载器的命名空间：子加载器可以访问到父加载器加载的类；而父加载器访问不到子加载器的类
        Class<?> clazz1 = loader1.loadClass("com.py.custom.tms.application.jvm.classload.MySample_1");
        System.out.println("clazz: " + clazz1.hashCode());
        Object object1 = clazz1.newInstance();

    }
}
